﻿#include <QtWidgets/QApplication>
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>

#include <vtkAutoInit.h>
#include <vtkMultiProcessController.h>
//#include <vtkMPIController.h>
//#include <vtk_mpi.h>
//#include <mpi.h>

#include <cstdlib>

#include "MainWindow/QtVtkModleWindow.h"


//VTK_MODULE_INIT(vtkRenderingOpenGL2);
//VTK_MODULE_INIT(vtkRenderingVulkan);
//VTK_MODULE_INIT(vtkInteractionStyle);



int main(int argc, char* argv[])
{
    /*  vtkSmartPointer<vtkMPIController> pMPIController = vtkMPIController::New();
      {
          MPI_Init(&argc, &argv);
          pMPIController->Initialize(&argc, &argv, 2);
          vtkMultiProcessController::SetGlobalController(pMPIController);
          int numProcs = pMPIController->GetNumberOfProcesses();
          int me = pMPIController->GetLocalProcessId();
      }
  */


  //初始化opengl    
    QApplication::setAttribute(Qt::AA_UseDesktopOpenGL);


    //高dpi屏幕适配
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
    //QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);


    QApplication app(argc, argv);
    QtVtkModleWindow mainWidow;
    mainWidow.show();


    //MPI_Finalize();
    return app.exec();
}



////
//#include <vtkAutoInit.h>
//VTK_MODULE_INIT(vtkRenderingOpenGL2);
//VTK_MODULE_INIT(vtkInteractionStyle);
//VTK_MODULE_INIT(vtkRenderingFreeType);
//
//#include <vtkSmartPointer.h>
//#include <vtkSphereSource.h>
//#include <vtkConeSource.h>
//#include <vtkPolyDataMapper.h>
//#include <vtkActor.h>
//#include <vtkRenderer.h>
//#include <vtkRenderWindow.h>
//#include <vtkRenderWindowInteractor.h>
//#include <vtkCamera.h>
//#include <vtkCommand.h>
//#include <vtkInteractorStyleTrackballCamera.h>
//#include <vtkCallbackCommand.h>
//#include <vtkProperty.h>
//
//#include <iostream>
//#include <thread>
//#include <mutex>
//#include <vector>
//#include <atomic>
//#include <chrono>
//
//// 全局互斥锁用于保护VTK对象访问
//std::mutex g_vtkMutex;
//
//// 渲染线程类
//class RenderThread
//{
//public:
//    RenderThread(int id, vtkRenderWindow* renderWindow)
//        : threadId(id), renderWindow(renderWindow), running(false)
//    {
//    }
//
//    void Start()
//    {
//        running = true;
//        thread = std::thread(&RenderThread::Run, this);
//    }
//
//    void Stop()
//    {
//        running = false;
//        if(thread.joinable())
//        {
//            thread.join();
//        }
//    }
//
//    void Run()
//    {
//        // 创建场景组件
//        vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
//        vtkSmartPointer<vtkActor> actor;
//
//        if(threadId % 2 == 0)
//        {
//            // 偶数ID创建球体
//            vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
//            sphereSource->SetRadius(1.0);
//            sphereSource->SetThetaResolution(30);
//            sphereSource->SetPhiResolution(30);
//
//            vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//            mapper->SetInputConnection(sphereSource->GetOutputPort());
//
//            actor = vtkSmartPointer<vtkActor>::New();
//            actor->SetMapper(mapper);
//            actor->GetProperty()->SetColor(0.0, 0.8, 0.3); // 绿色
//        }
//        else
//        {
//            // 奇数ID创建圆锥
//            vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New();
//            coneSource->SetResolution(60);
//            coneSource->SetHeight(3.0);
//            coneSource->SetRadius(1.0);
//
//            vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//            mapper->SetInputConnection(coneSource->GetOutputPort());
//
//            actor = vtkSmartPointer<vtkActor>::New();
//            actor->SetMapper(mapper);
//            actor->GetProperty()->SetColor(0.8, 0.2, 0.1); // 红色
//            actor->RotateX(30.0);
//        }
//
//        // 设置渲染器
//        renderer->AddActor(actor);
//        renderer->SetBackground(0.1, 0.2, 0.4);
//        renderer->ResetCamera();
//
//        // 将渲染器添加到窗口（需要线程安全）
//        {
//            std::lock_guard<std::mutex> lock(g_vtkMutex);
//            renderWindow->AddRenderer(renderer);
//        }
//
//        // 动画循环
//        while(running)
//        {
//            // 更新几何体（需要线程安全）
//            {
//                std::lock_guard<std::mutex> lock(g_vtkMutex);
//
//                // 旋转对象
//                actor->RotateY(0.5);
//                actor->RotateZ(0.2);
//
//                // 更新渲染
//                renderWindow->Render();
//            }
//
//            // 控制帧率
//            std::this_thread::sleep_for(std::chrono::milliseconds(30));
//        }
//
//        // 清理（需要线程安全）
//        {
//            std::lock_guard<std::mutex> lock(g_vtkMutex);
//            renderWindow->RemoveRenderer(renderer);
//        }
//    }
//
//private:
//    int threadId;
//    vtkRenderWindow* renderWindow;
//    std::thread thread;
//    std::atomic<bool> running;
//};
//
//
//// 自定义回调函数处理窗口关闭事件
//void ExitCallback(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
//{
//    auto renderWindow = static_cast<vtkRenderWindow*>(caller);
//    renderWindow->Finalize();
//    std::exit(0);
//}
//
//
//int main(int argc, char* argv[])
//{
//    // 创建主渲染窗口
//    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
//    renderWindow->SetSize(1200, 800);
//    renderWindow->SetWindowName("VTK Multi-threaded Rendering");
//    renderWindow->SetMultiSamples(4); // 开启多重采样抗锯齿
//
//    // 创建交互器
//    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//    interactor->SetRenderWindow(renderWindow);
//
//    // 设置交互样式
//    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
//    interactor->SetInteractorStyle(style);
//
//    // 注册退出回调
//    vtkSmartPointer<vtkCallbackCommand> exitCallback = vtkSmartPointer<vtkCallbackCommand>::New();
//    exitCallback->SetCallback(ExitCallback);
//    renderWindow->AddObserver(vtkCommand::ExitEvent, exitCallback);
//
//
//    //创建多线程
//    const int NUM_THREADS = 4;
//    std::vector<std::unique_ptr<RenderThread>> threads;
//
//    for(int i = 0; i < NUM_THREADS; ++i)
//    {
//        threads.push_back(std::unique_ptr<RenderThread>(
//            new RenderThread(i, renderWindow)));
//    }
//
//    // 启动线程
//    for(auto& t : threads)
//    {
//        t->Start();
//    }
//
//
//    // 启动交互器（在主线程）
//    interactor->Start();
//
//    // 停止所有线程
//    for(auto& t : threads)
//    {
//        t->Stop();
//    }
//
//    return 0;
//}